from django.contrib.auth import authenticate, login, logout as out
from django.contrib.auth.models import User
from django.db import IntegrityError
from django.shortcuts import render, redirect

# Create your views here.
# 类视图定义两个不同的方法处理两种不同的请求方式
# 类视图以请求方式为类方法在对应的方式下编写对应的逻辑代码
# 自定义的类为普通类，通过继承成为视图类
from django.views import View

from user import form
from user.form import UserLRForm


class UserView(View):
    # get类方法处理地址的get请求
    def get(self, request):
        form = UserLRForm()
        return render(request, 'user/register.html', {'form': form})

    def post(self, request):
        global message
        form = UserLRForm(request.POST)
        if form.is_valid():
            # 获取校验后的数据
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            # print(request.POST)
            # # 获取数据
            # username = request.POST.get("username")
            # password = request.POST.get("password")
            # # 校验数据
            # if not username:
            #     message = "注册失败，请输入用户名。"
            # elif 2 > len(username) or len(username) > 10:
            #     message = "注册失败，用户名长度为2-10。"
            # elif not password:
            #     message = "注册失败，请输入密码。"
            # elif 6 > len(password) or len(password) > 20:
            #     message = "注册失败，密码长度为6-20。"
            # # 保存数据 通过User模型类创建用户对象
            # else:
            try:
                user = User(username=username)
                # 密码要做加密
                user.set_password(password)
                user.save()
            except IntegrityError:
                message = "用户名已经存在，请重新输入。"
            else:
                message = "注册成功。"
        return render(request, 'user/register.html', context={"message": message,"form":form})


class LoginView(View):
    def get(self, request):
        # get请求时获取页面数据，需要把表单返回给模板进行渲染
        # 创建表单对象
        form = UserLRForm()
        # user=request.session['username']
        # 把表单对象传输给模板 前端进行渲染的操作
        return render(request, 'user/login.html', {'form': form})
        # return render(request, 'user/login.html',{'form':form,"user":user})

    def post(self, request):
        # username=request.POST.get('username')
        # password=request.POST.get('password')
        # 创建表单对象 需要绑定用户在表单填写的数据 让表单对象帮我们完成校验
        form = UserLRForm(request.POST)
        # is_valid()校验数据
        if form.is_valid():
            # 获取校验后的数据
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            # 验证用户名跟密码是否正确 校验通过
            # user = User.objects.get(username=username)
            # user.check_password(password)
            # 如果正确的话 会返回一个用户对象 否则会返回一个空值
            user=authenticate(username=username,password=password)
            # 判断用户是否存在
            if user:
                # 校验通过 把登陆的用户信息放到请求对象中
                # 使用内置的login来完成用户信息的认证
                # login有三个功能：
                # 1.生成新的或者更新用户会话(session)
                # 2. 将登陆用户信息放到请求对象中 绑定到request.user里 后续的请求（get post）通过用request来获取登录的用户信息
                # 3. 处理会话的安全设置 超时时间
                # 必须要先通过authenticate验证
                login(request,user)
                # 获取地址栏中的next参数保存的地址值
                # GET:请求 get:通过键获取值
                next_url=request.GET.get('next')
                if next_url:
                    return redirect(next_url)
                return redirect('index')

            # # 校验用户填写的信息格式是否有误
            # if not username:
            #     message = "登录失败，请输入用户名。"
            # elif 2 > len(username) or len(username) > 10:
            #     message = "登录失败，用户名长度为2-10。"
            # elif not password:
            #     message = "登录失败，请输入密码。"
            # elif 6 > len(password) or len(password) > 20:
            #     message = "登录失败，密码长度为6-20。"
            # else:
            # 校验用户填写的数据跟数据库里保存的是否一致
            # try:
            #     user = User.objects.get(username=username)
            # except User.DoesNotExist:
            #     message = "账号不存在，请注册后登录"
            # else:
            #     # 校验用户的密码是否正确
            #     if user.check_password(password):
            #         # 账号密码正确 创建session信息 做会话维持
            #         # 将用户名信息存储在session表里面 相当于给字典【request.session】添加一个键值对：’username‘：username
            #         request.session['username'] = username
            #         # 添加过期时间 过期时间单位：秒
            #         # request.session.set_expiry(300)
            #         return redirect('index') # 用下面的也可以
                    # return render(request, 'demo/index.html')
            #     else:
            #         message = "密码错误"
            # return render(request, 'user/login.html', context={'message': message,'user':username,"form":form})
            return render(request, 'user/login.html')


def logout(request, **kwargs):
    # 退出账号
    # request.session.flush()
    # 调用auth系统的out方法来退出登录 把请求对象用户登陆用户信息给清除掉
    # 必须要先通过authenticate验证
    out(request)
    return redirect('login')


























